package Clases;

import java.lang.String;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Enumeration;

public class ProcesaConsultas {

    /// SELECT_3
    /// INSERT_3;VALOR 
    /// UPDATE_3;VALOR
    /// DELETE_3;VALOR
    /// SCAN_VALOR
    public String consultar(String linea, Operaciones operaciones) {
        ArrayList query = parsearQuery(linea, operaciones);
        return Diccionario.Instancia().select(Integer.parseInt(query.get(0).toString()));
    }

    public String scanear(String linea, Operaciones operaciones) {
        ArrayList<String> query = parsearQuery(linea, operaciones);
        Dictionary<Integer, String> respuestaScan = Diccionario.Instancia().scan(query.get(0));
        return HashAString(respuestaScan);
    }

    /***
     * Transforma el resultado del scan en un String
     * @param respuestaScan
     * @return
     */
    private String HashAString(Dictionary<Integer, String> respuestaScan) {
        StringBuilder respuesta = new StringBuilder();
        Enumeration clavesDiccionario = respuestaScan.keys();
        while (clavesDiccionario.hasMoreElements()) {
            Integer clave = (Integer) clavesDiccionario.nextElement();
            String valor = respuestaScan.get(clave);
            respuesta.append(clave + "," + valor + ";");
        }
        String respuestaString =  respuesta.toString();
        if(respuesta.length()>0){
            return respuestaString.substring(0, respuesta.length()-1); //se le saca el ultimo ';'
        }else{
            return "";
        }
    }

    public enum Operaciones {

        SELECT, UPDATE, INSERT, DELETE, SCAN
    }

    public ProcesaConsultas() {
    }

    public ArrayList<String> parsearQuery(String query, Operaciones op) {
        String demanda = query.split("_")[1];
        ArrayList<String> tupla = new ArrayList();
        switch (op) {
            case SELECT:
                tupla.add(demanda);
                break;
            case SCAN:
                tupla.add(demanda);
                break;
            case DELETE:
                tupla.add(demanda);
                break;
            default:
                String[] queryParseada = demanda.split(";");
                tupla.add(queryParseada[0]);
                tupla.add(queryParseada[1]);
                break;
        }
        return tupla;
    }

    public String procesar(String linea, Operaciones op) {
        ArrayList<String> datos = parsearQuery(linea, op);
        Boolean resultado = false;
        switch (op) {
            case INSERT:
                resultado = Diccionario.Instancia().insert(Integer.parseInt(datos.get(0)), datos.get(1));
                break;
            case UPDATE:
                resultado = Diccionario.Instancia().update(Integer.parseInt(datos.get(0)), datos.get(1));
                break;
            case DELETE:
                resultado = Diccionario.Instancia().delete(Integer.parseInt(datos.get(0)));
                break;
            default:
                break;
        }
        return resultado.toString();
    }

    public static Operaciones obtenerOperacion(String linea) {
        String[] lineaSeparada = linea.split("_");
        String operacion = lineaSeparada[0];
        if (operacion.equals("SELECT")) {
            return Operaciones.SELECT;
        }
        if (operacion.equals("UPDATE")) {
            return Operaciones.UPDATE;
        }
        if (operacion.equals("INSERT")) {
            return Operaciones.INSERT;
        }
        if (operacion.equals("DELETE")) {
            return Operaciones.DELETE;
        }
        if (operacion.equals("SCAN")) {
            return Operaciones.SCAN;
        }

        return null;
    }
}
